最后更新时间:2019年6月17日
功能介绍
随着定位、跟踪、存储技术的快速发展,位置采集和移动计算技术的进步,已经产生了大量的空间轨迹数据。通过搜集大量的人、动物和车辆等移动轨迹数据,进而了解人的生活规律,动物的活动习性,以及一个城市的交通状况等。
轨迹记录就是在时空环境下,记录一个或多个移动对象在运动过程中的空间位置信息和属性信息的变化。这些信息根据时间的先后顺序构成了轨迹。多用于交通、气象、生态和移动服务等领域,理解和分析这些轨迹记录可以帮助我们很好挖掘信息,解决许多重要的问题。例如,对于大众来说,他们希望可以记录生活,同时分享给他人,通过轨迹记录功能可以记录实时位置信息,并可在未来的某一时间段进行回放,为他人提供参考。目前,该功能已应用于常用的地图导航软件,如百度地图,以及运动软件、旅游软件等和地理信息有关的软件中;对于出租车司机来说,他们希望快速找到搭载的乘客以获取盈利,通过轨迹记录可以分析并预测一个区域未来的乘客数量,可为出租车司机提供最快找到乘客的路线;对于台风预警人员,可以通过对各种数据的监测以及台风历史线路的轨迹回放,据制定相应的应对方案。由此可见,轨迹记录正在被越来越多的行业和用户所需要。
MapGIS Mobile SDK提供了轨迹记录功能模块,调用其接口可快速将轨迹记录功能集成于各种场景应用中。
功能接口
轨迹记录功能对应的API程序包为com.zondy.mapgis.android.track,核心类为Track(轨迹类),核心接口如下所示:
接口 | 说明 |
---|---|
addLocation() | 添加定位信息(添加的定位信息单位必须是经纬度) |
setTrackFeatureCls() | 设置简单要素类(轨迹存放到点简单要素类中) |
setSmooth() | 设置是否平滑处理 |
setTimeInterval() | 设置GPS数据时间间隔(默认时间间隔1秒) |
setMindistanceInterval() | 设置最小距离间隔(单位为米,默认的距离间隔是5米) |
setMatchLineLayer() | 设置道路匹配线矢量图层 |
startTrack() | 开始轨迹记录 |
setTrackerListener() | 设置轨迹监听 |
endTrack() | 结束轨迹记录 |
轨迹自采集
轨迹自动采集功能,可以将移动定位结果自动保存为移动端的离线矢量数据,可实现轨迹点去重、剔除异常点、轨迹平滑、自动加密和稀疏的处理,也可利用轨迹与线要素的自动匹配功能实现抓路功能。轨迹自动采集功能,主要为结合实时定位功能,根据设置的轨迹采集规则与模式(如按时间间隔采集),采集并存储当前定位点信息。
轨迹自采集功能通过轨迹记录类(Track)实现,通过实现流程如下图所示:
1
构造轨迹记录对象(Track),并设置轨迹记录模式。SDK提供了多种辅助轨迹采集的功能,例如能够对定位点进行去重、剔除异常点,对轨迹进行平滑、自动加密和稀疏处理,还有轨迹与线要素的自动匹配功能,可根据需要进行相应的代码设置。
//构造轨迹记录对象 Track mTrack = new Track();
mTrack.setSmooth(true);
mTrack.setMindistanceInterval(50);
mTrack.setTimeInterval(5);
//获取矢量图层 int index=mapView.getMap().indexOf("道路线"); vectorLayer= (VectorLayer) mapView.getMap().getLayer(index); //设置道路匹配线矢量图层 mTrack.setMatchLineLayer(vectorLayer);
2
轨迹记录采集的结果是作为矢量数据保存到移动地理数据库中,所以在开始记录之前需要为其设置保存的简单要素类。
//简单要素类URL String mClsUrl=Environment.getExternalStorageDirectory().getPath()+"/MapGIS Mobile 2D Sample/Track/TrackSample.mgdb"+"|"+"mTrack"; //字段集 Fields fieldCreate = new Fields(); //字段,可传递轨迹的一些信息,如人名,时间,长度等 Field nameField = new Field(); nameField.setFieldType(FieldType.fldStr); //字段类型 nameField.setMskLength((short) 30); //字段字节长度 nameField.setFieldName("轨迹采集者"); //字段名称 //追加字段 int addFild = fieldCreate.appendField(nameField); if (addFild > 0) { //创建简单要素类 SFeatureCls featureCls = Track.createTrackFeatureCls(mClsUrl, fieldCreate); if (featureCls != null) { //设置简单要素类(轨迹存放到点简单要素类中) mTrack.setTrackFeatureCls(featureCls); } }
3
记录轨迹,通过轨迹记录对象(Track类对象),调用startTrack()开启轨迹记录。
//开始记录轨迹 mTrack.startTrack();
同时需要不断地为轨迹记录对象添加定位信息,一般采用实时定位方式,在定位监听回调中获取位置信息,调用addLocation()添加定位信息。可采用Android原生GPS定位方式获取位置信息,关键代码如下所示,也可通过其他方式获取。
//使用指定的提供者注册位置更新 mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 1, locationListener); //用于在位置更改时从LocationManager接收通知 private LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { //构造定位信息类,设置经度、纬度 GNNSInfo gnnsInfo = new GNNSInfo(); gnnsInfo.setlongitude(location.getLongitude()); gnnsInfo.setlatitude(location.getLatitude()); //添加定位信息(添加的定位信息单位必须是经纬度) mTrack.addLocation(gnnsInfo); } };
如果需要停止轨迹记录,可调用endTrack()实现。
4
为轨迹记录对象设置轨迹监听器,动态获取轨迹点。
//设置轨迹监听 mTrack.setTrackerListener(new Track.TrackListener() { @Override public void onLocationAdjusted(final GNNSInfo gnnsinfo) { Log.e("轨迹点坐标", "X:" + gnnsinfo.getlongitude() + "\nY:" + gnnsinfo.getlatitude()); //构造Dot点 Dot dot = new Dot(gnnsinfo.getlongitude(), gnnsinfo.getlatitude()); //可利用GraphicPolylin将轨迹以线图形绘制显示在地图上 } });
轨迹记录实现效果如下所示:
轨迹回放
轨迹自动采集功能,会将定位结果自动保存为移动端的离线矢量数据,一条轨迹对应一个地图要素,要素类型为多点几何对象。也可以将轨迹数据保存至业务关系数据库,以及kml、gpx等格式文件中,或者将离线轨迹矢量数据同步上传到GIS服务器等等,具体可根据业务需求进行选择。采集轨迹数据后,当需要查看已经记录的轨迹路线情况,则需要用到轨迹回放。轨迹回放功能的实现原理,即先读取采集的轨迹点数据,基于点的标绘功能,动态模拟目标点在地图上的运动轨迹。
1
从mgdb移动地理数据库中获取轨迹采集时记录的轨迹点。
String mgdbPath = Environment.getExternalStorageDirectory().getPath()+"/MapGIS Mobile 2D Sample/Track/TrackSample.mgdb"; //创建数据库对象并打开 DataBase dataBase = new DataBase(); long dbOP = dataBase.open(mgdbPath); if (dbOP > 0) { //获取所有简单要素类的id IntList intList = dataBase.getXclseIDs(XClsType.SFCls, 0); for (int i = 1; i <= intList.size(); i++) { //获取名称为“mTrack”的要素类 if (dataBase.getXclsName(XClsType.SFCls, i).equals("mTrack")) { //创建要素类并打开 SFeatureCls sFeatureCls = new SFeatureCls(dataBase); long sfclsOP = sFeatureCls.open("mTrack"); if (sfclsOP > 0) { long count = sFeatureCls.getCount(); //要素类中要素数量 Geometry geometry = sFeatureCls.getGeometry(i); //获取某个几何对象 GeometryType geometryType = geometry.getType(); //获取类型 //判断几何对象类型(一条轨迹对应一个简单要素类中的要素,几何对象为多点) if (geometryType == GeometryType.GeoPoints) { //转换为多点对象 GeoPoints geoPoints = (GeoPoints) geometry; for (int j = 0; j < geoPoints.length(); j++) {//获取每一个点 Dot3D dot3d = geoPoints.get(j); mgdbDots.add(new Dot(dot3d.x, dot3d.y)); //存储在dot集合中 } } } } } }
2
获取轨迹点之后,可以利用多点图形对象进行绘制。
if (mgdbDots.size() > 0) { //构建多点图形对象,并设置颜色、点大小、点集,然后添加到覆盖物图层进行绘制 GraphicMultiPoint trackMultiPoint = new GraphicMultiPoint(); trackMultiPoint.setColor(Color.GREEN); trackMultiPoint.setPointSize(3); trackMultiPoint.setPoints(mgdbDots); mapView.getGraphicsOverlay().addGraphic(trackMultiPoint); mapView.refresh(); }